//
//  YXUserAccount1.swift
//  yanXiangWeiBo
//
//  Created by 颜祥 on 15/12/21.
//  Copyright © 2015年 yanxiang. All rights reserved.
//

import UIKit

/*
    iOS中数据存储的方式:
    1.偏好设置
    2.归档和解档
    3.NSArray,NSDictionary写入文件
    4.sqlite数据库
    5.coreData(核心是sqlite数据库)
*/

class YXUserAccount: NSObject,NSCoding
{
    //TODO: 判断用户是否已经登录
    // 类属性，不用创建对象，直接调用
    class var isUserLogin: Bool
    {
        return YXUserAccount.loadUserAccount() != nil
    }
    
    
    
    // 定义属性，用来保存用户的帐户
    /*
    result:Optional({
    "access_token" = "2.00r3G2zB3LDinB915be41466ucAiVB";
    "expires_in" = 157679999;
    "remind_in" = 157679999;//access_token的生命周期（该参数即将废弃，开发者请使用expires_in）
    uid = 1822518697;
    })
    
    */
    // access_token:用于调用access_token，接口获取授权后的access token
    var access_token: String?
    
    // uid:当前授权用户的UID
    var uid: String?
    
    // expires_in:access_token的生命周期，单位是秒数
    var expires_in: NSTimeInterval = 0
    {
        // 属性监听器，用来给属性设置值
        didSet
        {
            // 自己来生成过期时间
            expires_date = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    
    // expires_date:过期时间
    var expires_date: NSDate?
    
    
    // 用户昵称
    var screen_name: String?
    
    // 用户头像地址（大图），180×180像素
    var avatar_large: String?
    
    
    // MARK: - 字典转模型
    init(dict: [String: AnyObject])
    {
        // 一定要先调用父类的方法
        super.init()
        
        // KVC,如果属性的个数比较少，可以单个赋值
        setValuesForKeysWithDictionary(dict)
    }
    
    // 当没有找到未定义的key时调用，程序就不会崩溃
    // 不用去里面实现这个方法即可
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    // MARK: - 打印对象
    override var description: String
    {
        get{
            
            return "access_token: \(access_token),uid:\(uid),expires_in:\(expires_in),expires_date:\(expires_date)"
        }
    }
    
    // MARK: - 保存帐户---遵守NSCoding协议
    // MARK: - 归档
    func encodeWithCoder(aCoder: NSCoder)
    {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expires_date, forKey: "expires_date")
    }
    
    // MARK: - 解档
    required init?(coder aDecoder: NSCoder)
    {
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        uid = aDecoder.decodeObjectForKey("uid") as? String
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        expires_date = aDecoder.decodeObjectForKey("expires_date") as? NSDate
    }
    
    
    // 获得沙盒路径,设置为静态,只能通过类名来调用
    static var filePath = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.plist")
    
    // MARK: - 保存帐户
    func saveUserAccount()
    {
        NSKeyedArchiver.archiveRootObject(self, toFile: YXUserAccount.filePath)
        
    }
    
    // loadUserAccount()调用是很频繁的，每次加载都要调用这个方法，是很消耗性能的，当有可用帐号时，保存到对象的属性中(内存中，效率非常高)，下次使用时，直接使用属性(内存中的帐号)，可以提高性能
    static var userAccount: YXUserAccount?
    
    // MARK: - 加载帐户
    // 设置为类方法,方便调用
    class func loadUserAccount() -> YXUserAccount?
    {
        // 1.如果帐户为空，表示内存中没有，就去沙盒中加载
        if userAccount == nil
        {
           userAccount =  NSKeyedUnarchiver.unarchiveObjectWithFile(YXUserAccount.filePath) as? YXUserAccount
            
        }
        
        // 2.如果帐户存在且帐户还没有过期
        if userAccount != nil && userAccount?.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending//OrderedDescending:降序
        {
            //print("加载到可用帐户")
            return userAccount
        }
        
        // 3.如果帐户不存在或帐户已经过期
        print("帐户不存在或帐户已经过期")
        return nil
        
//        if let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(YXUserAccount1.filePath) as? YXUserAccount1
//        {
//            // 帐户存在
//            if userAccount.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending
//            {
//                print("加载到可用帐户")
//                return userAccount
//            }else // 帐户过期
//            {
//                print("帐户过期")
//                return nil
//            }
//            
//        }else
//        {
//            print("帐户不存在")
//            return nil
//        }
        
        
    }
    
    
    
    // MARK: - 加载用户
    // 准备一个闭包,将加载完成后的信息返回给调用者(控制器)
    func loadUserInfo(finished:(error: NSError?) -> ())
    {
        // 调用网络工具类准备好的方法
        YXNetWorkTool.sharedInstance.loadUserInfo { (result, error) -> () in
            
            // 加载发生错误
            if error != nil && result == nil
            {
                print("获取用户数据有错误: \(error)")
                // 将错误回调给调用者
                finished(error: error)
                return
            }
            
            // 加载成功
            // 解析服务器返回的数据，获得用户的昵称和用户的头像
            self.screen_name = result!["screen_name"] as? String
            self.avatar_large = result!["avatar_large"] as? String
            
            // 将最新的用户信息保存到沙盒
            self.saveUserAccount()
            
            // 将最新的对象赋值给属性
            YXUserAccount.userAccount = self
            
            // 调用闭包告诉调用者(控制器)获取用户数据成功
            finished(error: nil)
        }
    }

}
